import { useNavigate, useLocation } from 'react-router-dom';
import monitorManager from '@/utils/monitor';

/**
 * 手动路由变化上报Hook
 * 提供增强的导航方法和纯上报功能
 * @returns {Object} 包含导航和上报相关方法的对象
 */
const useManualRouteReport = () => {
  const navigate = useNavigate();
  const location = useLocation();

  /**
   * 增强的导航方法，支持手动路由上报
   * @param {string|object} to - 目标路径或位置对象
   * @param {Object} options - 导航选项
   * @param {Object} [options.state] - 路由状态
   * @param {boolean} [options.replace] - 是否替换历史
   * @param {boolean} [options.skipReport] - 是否跳过上报
   * @param {Object} [options.reportOptions] - 上报配置选项
   * @param {boolean} [options.reportOptions.includeQueryParams] - 是否包含查询参数
   * @param {boolean} [options.reportOptions.includeHash] - 是否包含哈希值
   * @param {boolean} [options.reportOptions.autoGenerateFingerprint] - 是否自动生成页面指纹
   * @param {Object} [options.meta] - 路由元数据
   * @param {Object} [options.customData] - 自定义业务数据
   * @returns {string|null} 上报事件ID，如果上报失败或跳过则返回null
   */
  const enhancedNavigate = (to, options = {}) => {
    const {
      state = {},
      replace = false,
      skipReport = false,
      reportOptions = {},
      meta = {},
      customData = {}
    } = options;
    
    // 构建目标路径
    const targetPath = typeof to === 'string' ? to : 
                      `${to.pathname}${to.search || ''}${to.hash || ''}`;
    
    // 构建完整的路由信息
    const routeInfo = {
      from: `${location.pathname}${location.search}${location.hash}`,
      to: targetPath,
      fromTitle: document.title,
      action: replace ? 'replace' : 'push',
      meta: {
        navigationType: replace ? 'replace' : 'push',
        ...meta
      }
    };
    
    // 构建上报配置
    const reportConfig = {
      ...reportOptions,
      customData: {
        navigationState: state,
        ...customData
      }
    };
    
    let eventId = null;
    
    // 手动上报路由变化（如果未跳过）
    if (!skipReport && monitorManager?.manualTrackRouteChange) {
      try {
        eventId = monitorManager.manualTrackRouteChange(routeInfo, reportConfig);
        if (eventId) {
          // eslint-disable-next-line no-console
          console.debug('路由变化已手动上报，事件ID:', eventId);
        }
      } catch (error) {
        // eslint-disable-next-line no-console
        console.warn('路由上报失败，不影响导航:', error);
      }
    }
    
    // 执行实际导航
    navigate(to, {
      state,
      replace
    });
    
    return eventId;
  };
  
  /**
   * 直接上报路由变化，不触发导航
   * 适用于需要手动记录路由变化但导航由其他方式触发的场景
   * @param {Object} routeInfo - 路由信息
   * @param {string} routeInfo.from - 来源路径
   * @param {string} routeInfo.to - 目标路径
   * @param {string} [routeInfo.fromTitle] - 来源页面标题
   * @param {string} [routeInfo.action] - 导航动作类型
   * @param {Object} [routeInfo.meta] - 路由元数据
   * @param {Object} [reportOptions] - 上报配置选项
   * @returns {string|null} 上报事件ID，如果上报失败则返回null
   */
  const reportRouteChange = (routeInfo, reportOptions = {}) => {
    if (monitorManager?.manualTrackRouteChange) {
      try {
        const eventId = monitorManager.manualTrackRouteChange(routeInfo, reportOptions);
        if (eventId) {
          // eslint-disable-next-line no-console
          console.debug('路由变化已手动上报，事件ID:', eventId);
        }
        return eventId;
      } catch (error) {
        // eslint-disable-next-line no-console
        console.warn('路由上报失败:', error);
      }
    }
    return null;
  };
  
  return {
    navigate: enhancedNavigate,  // 增强的导航方法
    originalNavigate: navigate,  // 原始导航方法
    reportRouteChange            // 纯上报方法
  };
};

export default useManualRouteReport;